/**
 * 字体大小管理工具
 * 提供字体大小切换、保存、恢复等功能
 */

// 可用的字体大小列表
export const FONT_SIZES = [
  { value: 12, label: '小', description: '小号字体' },
  { value: 13, label: '较小', description: '较小字体' },
  { value: 14, label: '标准', description: '标准字体' },
  { value: 15, label: '较大', description: '较大字体' },
  { value: 16, label: '大', description: '大号字体' }
]

// 字体大小映射对象
export const FONT_SIZE_MAP = FONT_SIZES.reduce((map, size) => {
  map[size.value] = size
  return map
}, {})

// 默认字体大小
export const DEFAULT_FONT_SIZE = 13

// 本地存储键名
export const FONT_SIZE_STORAGE_KEY = 'fs'

// 当前字体大小状态（内存中保存）
let currentFontSizeState = null

/**
 * 获取当前字体大小
 * @returns {number} 当前字体大小
 */
export function getCurrentFontSize() {
  // 如果已经设置过字体大小，直接返回当前字体大小
  if (currentFontSizeState) {
    return currentFontSizeState
  }

  try {
    // 尝试从本地存储获取字体大小
    const saved = localStorage.getItem(FONT_SIZE_STORAGE_KEY)
    if (saved) {
      const size = parseInt(saved)
      if (FONT_SIZES.some(item => item.value === size)) {
        currentFontSizeState = size
        return size
      }
    }
  } catch (error) {
    console.warn('获取字体大小设置失败:', error)
  }

  // 返回默认字体大小（14px）
  currentFontSizeState = DEFAULT_FONT_SIZE
  return DEFAULT_FONT_SIZE
}

/**
 * 设置字体大小
 * @param {number} size 字体大小
 * @returns {boolean} 是否设置成功
 */
export function setFontSize(size) {
  try {
    // 验证字体大小是否有效
    if (!FONT_SIZES.some(item => item.value === size)) {
      console.warn(`字体大小 ${size}px 不在支持范围内`)
      return false
    }

    // 获取根元素
    const root = document.documentElement

    // 设置CSS变量
    root.style.setProperty('--font-size-base', `${size}px`)
    
    // 根据基础字体大小调整其他字体大小
    const smallSize = Math.max(12, size - 2)
    const mediumSize = Math.max(12, size - 1)
    const largeSize = size + 1
    const xlSize = size + 2

    root.style.setProperty('--font-size-small', `${smallSize}px`)
    root.style.setProperty('--font-size-medium', `${mediumSize}px`)
    root.style.setProperty('--font-size-large', `${largeSize}px`)
    root.style.setProperty('--font-size-xl', `${xlSize}px`)

    // 保存到本地存储
    localStorage.setItem(FONT_SIZE_STORAGE_KEY, size.toString())

    // 更新内存状态
    currentFontSizeState = size

    // 触发字体大小变更事件
    window.dispatchEvent(new CustomEvent('fontSizeChanged', {
      detail: { fontSize: size, fontSizeInfo: FONT_SIZE_MAP[size] }
    }))

    return true
  } catch (error) {
    console.error('设置字体大小失败:', error)
    return false
  }
}

/**
 * 初始化字体大小
 * 在应用启动时调用，恢复用户上次选择的字体大小
 */
export function initFontSize() {
  const currentSize = getCurrentFontSize()
  setFontSize(currentSize)
}

/**
 * 清除字体大小状态
 * 重置为默认字体大小
 */
export function clearFontSizeState() {
  currentFontSizeState = null
  
  try {
    localStorage.removeItem(FONT_SIZE_STORAGE_KEY)
  } catch (error) {
    console.warn('清除字体大小设置失败:', error)
  }

  // 重置为默认字体大小
  setFontSize(DEFAULT_FONT_SIZE)
}

/**
 * 切换到下一个字体大小
 * @returns {number} 新的字体大小
 */
export function switchToNextFontSize() {
  const currentSize = getCurrentFontSize()
  const sizeValues = FONT_SIZES.map(size => size.value)
  const currentIndex = sizeValues.indexOf(currentSize)
  const nextIndex = (currentIndex + 1) % sizeValues.length
  const nextSize = sizeValues[nextIndex]

  setFontSize(nextSize)
  return nextSize
}

/**
 * 切换到上一个字体大小
 * @returns {number} 新的字体大小
 */
export function switchToPrevFontSize() {
  const currentSize = getCurrentFontSize()
  const sizeValues = FONT_SIZES.map(size => size.value)
  const currentIndex = sizeValues.indexOf(currentSize)
  const prevIndex = currentIndex === 0 ? sizeValues.length - 1 : currentIndex - 1
  const prevSize = sizeValues[prevIndex]

  setFontSize(prevSize)
  return prevSize
}

/**
 * 重置为默认字体大小
 */
export function resetFontSize() {
  setFontSize(DEFAULT_FONT_SIZE)
}

/**
 * 获取字体大小信息
 * @param {number} size 字体大小
 * @returns {object|null} 字体大小信息对象
 */
export function getFontSizeInfo(size) {
  return FONT_SIZE_MAP[size] || null
}

/**
 * 获取所有字体大小列表
 * @returns {array} 字体大小列表
 */
export function getAllFontSizes() {
  return FONT_SIZES
}

/**
 * 监听字体大小变更
 * @param {function} callback 回调函数
 * @returns {function} 取消监听的函数
 */
export function onFontSizeChange(callback) {
  const handler = (event) => {
    callback(event.detail)
  }

  window.addEventListener('fontSizeChanged', handler)

  // 返回取消监听的函数
  return () => {
    window.removeEventListener('fontSizeChanged', handler)
  }
}

/**
 * 获取字体大小对应的CSS变量值
 * @param {string} variableName CSS变量名（不包含--前缀）
 * @returns {string} CSS变量值
 */
export function getFontSizeVariable(variableName) {
  const root = document.documentElement
  const computedStyle = getComputedStyle(root)
  return computedStyle.getPropertyValue(`--${variableName}`).trim()
}

/**
 * 动态设置字体大小CSS变量
 * @param {string} variableName CSS变量名（不包含--前缀）
 * @param {string} value 变量值
 */
export function setFontSizeVariable(variableName, value) {
  const root = document.documentElement
  root.style.setProperty(`--${variableName}`, value)
}

// 导出字体大小管理类
export class FontSizeManager {
  constructor() {
    this.currentSize = getCurrentFontSize()
    this.listeners = []
  }

  // 设置字体大小
  setFontSize(size) {
    const success = setFontSize(size)
    if (success) {
      this.currentSize = size
      this.notifyListeners()
      return true
    }
    return false
  }

  // 获取当前字体大小
  getCurrentFontSize() {
    return this.currentSize
  }

  // 添加监听器
  addListener(callback) {
    this.listeners.push(callback)
    return () => {
      const index = this.listeners.indexOf(callback)
      if (index > -1) {
        this.listeners.splice(index, 1)
      }
    }
  }

  // 通知监听器
  notifyListeners() {
    const sizeInfo = FONT_SIZE_MAP[this.currentSize]
    this.listeners.forEach(callback => {
      try {
        callback(this.currentSize, sizeInfo)
      } catch (error) {
        console.error('字体大小监听器执行失败:', error)
      }
    })
  }

  // 初始化
  init() {
    initFontSize()
    this.currentSize = getCurrentFontSize()
  }
}

// 创建默认实例
export const fontSizeManager = new FontSizeManager()
